BIBLIOTECAS

In [1]:
import pandas as pd
import numpy as np
import missingno as msno
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import warnings
warnings.filterwarnings('ignore')
In [2]:
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
from catboost import CatBoostClassifier
from sklearn import metrics
from sklearn.metrics import roc_curve
from sklearn.metrics import recall_score, confusion_matrix, precision_score, f1_score, accuracy_score, classification_report

Tratamentos dos dados

carregando dados

In [3]:
df=pd.read_excel(R'C:\Users\Anderson Salata\Documents\Testes Analista Dados Sr\Case_Formatura.xlsx')
In [4]:
df.head()
Out[4]:
COD_ALUNO COD_UNIDADE COD_TURMA SEXO ESTADO_CIVIL DATA_NASCIMENTO CIDADE_ALUNO UF_ALUNO CEP_ALUNO COD_CURSO ... NR_DISC_APROVADA T_IDADE NOTA NOTA_ENEM POSSUI_ENEM NRO_REPRO_ACO NRO_TOTAL_REPRO NRO_REPRO_NORMAL SEMESTRES_CURSADOS POSSUI_FIES
0 1000055 508 316720151A 2 S 1996-11-19 00:00:00 BETIM MG 32.661-750 3167 ... 27 21 8.711111 537.575 1 NaN NaN NaN 4 SIM
1 1000143 550 9917120151A 2 S 1996-09-03 23:00:00 APUCARANA PR 86.801-040 99171 ... 30 21 8.140000 421.000 1 NaN NaN NaN 4 NAO
2 1000179 1 80820151A 2 S 1950-06-29 23:00:00 CUIABÁ MT 78.065-900 808 ... 30 67 8.510000 NaN 0 NaN NaN NaN 4 NAO
3 1000210 1 80820151A 2 C 1981-11-23 23:00:00 POCONÉ MT 78.175-000 808 ... 30 36 8.456667 NaN 0 NaN NaN NaN 4 SIM
4 1000228 6 52220112A 1 S 1979-12-29 23:00:00 SALVADOR BA 41.250-470 522 ... 50 37 7.624490 NaN 0 43.0 48.0 5.0 14 NAO

5 rows × 29 columns

In [5]:
df.shape
Out[5]:
(68826, 29)
In [6]:
df.sample(3).T
#conferindo a importação dos dados.
Out[6]:
34892 51616 33499
COD_ALUNO 485876 698101 478442
COD_UNIDADE 5 510 514
COD_TURMA 184220122A 6768520092A1 6898220121A
SEXO 2 1 2
ESTADO_CIVIL C C S
DATA_NASCIMENTO 1989-08-22 23:00:00 1980-03-16 23:00:00 1986-08-01 23:00:00
CIDADE_ALUNO PRIMAVERA DO LESTE IPATINGA RIBEIRÃO DAS NEVES
UF_ALUNO MT MG MG
CEP_ALUNO 78.850-000 35.162-282 30.140-060
COD_CURSO 1842 67685 68982
NOME_CURSO Fisioterapia - M Engenharia Mecânica - N Enfermagem - N
TURNO_CURSO 0 3 3
DURACAO_CURSO 10 10 10
SITUCAO_MATRICULA Formado Formado Formado
DATA_CONCLUSAO 2017-06-12 23:00:00 2013-12-13 00:00:00 2016-12-16 00:00:00
PERIODOS_TRANCADOS 0 0 0
CH_TOTAL_MATRIZ 3980 3670 4000
NR_TOTAL_DISCIPLINAS 53 67 49
CH_APROVADA 3980 3670 4000
NR_DISC_APROVADA 53 67 49
T_IDADE 28 37 31
NOTA 7.70577 8.21 7.52245
NOTA_ENEM 467.6 NaN 424.525
POSSUI_ENEM 1 0 1
NRO_REPRO_ACO 21 2 7
NRO_TOTAL_REPRO 29 3 10
NRO_REPRO_NORMAL 8 1 3
SEMESTRES_CURSADOS 12 12 10
POSSUI_FIES SIM NAO SIM
In [17]:
df.info()
#verificando os tipos de variáveis existentes no banco de dados
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68826 entries, 0 to 68825
Data columns (total 29 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   COD_ALUNO             68826 non-null  int64  
 1   COD_UNIDADE           68826 non-null  int64  
 2   COD_TURMA             68826 non-null  object 
 3   SEXO                  68826 non-null  int64  
 4   ESTADO_CIVIL          68826 non-null  object 
 5   DATA_NASCIMENTO       68826 non-null  object 
 6   CIDADE_ALUNO          68826 non-null  object 
 7   UF_ALUNO              68822 non-null  object 
 8   CEP_ALUNO             68826 non-null  object 
 9   COD_CURSO             68826 non-null  int64  
 10  NOME_CURSO            68826 non-null  object 
 11  TURNO_CURSO           68826 non-null  int64  
 12  DURACAO_CURSO         68826 non-null  int64  
 13  SITUCAO_MATRICULA     68826 non-null  object 
 14  DATA_CONCLUSAO        68826 non-null  object 
 15  PERIODOS_TRANCADOS    68826 non-null  int64  
 16  CH_TOTAL_MATRIZ       68826 non-null  int64  
 17  NR_TOTAL_DISCIPLINAS  68826 non-null  int64  
 18  CH_APROVADA           68826 non-null  int64  
 19  NR_DISC_APROVADA      68826 non-null  int64  
 20  T_IDADE               68826 non-null  int64  
 21  NOTA                  68826 non-null  float64
 22  NOTA_ENEM             20797 non-null  float64
 23  POSSUI_ENEM           68826 non-null  int64  
 24  NRO_REPRO_ACO         62339 non-null  float64
 25  NRO_TOTAL_REPRO       62339 non-null  float64
 26  NRO_REPRO_NORMAL      62339 non-null  float64
 27  SEMESTRES_CURSADOS    68826 non-null  int64  
 28  POSSUI_FIES           68826 non-null  object 
dtypes: float64(5), int64(14), object(10)
memory usage: 15.2+ MB

#

In [7]:
df.columns.values
Out[7]:
array(['COD_ALUNO', 'COD_UNIDADE', 'COD_TURMA', 'SEXO', 'ESTADO_CIVIL',
       'DATA_NASCIMENTO', 'CIDADE_ALUNO', 'UF_ALUNO', 'CEP_ALUNO',
       'COD_CURSO', 'NOME_CURSO', 'TURNO_CURSO', 'DURACAO_CURSO',
       'SITUCAO_MATRICULA', 'DATA_CONCLUSAO', 'PERIODOS_TRANCADOS',
       'CH_TOTAL_MATRIZ', 'NR_TOTAL_DISCIPLINAS', 'CH_APROVADA',
       'NR_DISC_APROVADA', 'T_IDADE', 'NOTA', 'NOTA_ENEM', 'POSSUI_ENEM',
       'NRO_REPRO_ACO', 'NRO_TOTAL_REPRO', 'NRO_REPRO_NORMAL',
       'SEMESTRES_CURSADOS', 'POSSUI_FIES'], dtype=object)
In [8]:
df.corr().T
#conhecendo as correlações das variáveis do tipo inteiro.
Out[8]:
COD_ALUNO COD_UNIDADE SEXO COD_CURSO TURNO_CURSO DURACAO_CURSO PERIODOS_TRANCADOS CH_TOTAL_MATRIZ NR_TOTAL_DISCIPLINAS CH_APROVADA NR_DISC_APROVADA T_IDADE NOTA NOTA_ENEM POSSUI_ENEM NRO_REPRO_ACO NRO_TOTAL_REPRO NRO_REPRO_NORMAL SEMESTRES_CURSADOS
COD_ALUNO 1.000000 -0.017537 -0.015254 -0.170081 0.073950 -0.184280 -0.047297 -0.205748 -0.166476 -0.205374 -0.166111 0.029181 0.079689 -0.044882 0.144720 -0.008124 -0.015831 -0.026626 -0.075669
COD_UNIDADE -0.017537 1.000000 -0.102092 0.887673 0.206036 -0.043708 -0.023068 -0.107250 -0.031640 -0.108314 -0.033086 -0.030578 -0.113781 0.121998 -0.040707 -0.102713 -0.111095 -0.068551 -0.064741
SEXO -0.015254 -0.102092 1.000000 -0.093982 -0.101802 -0.044520 -0.022952 0.008579 -0.078879 0.008874 -0.078351 -0.036046 0.101507 -0.211729 0.014264 -0.030389 -0.052127 -0.078249 -0.077461
COD_CURSO -0.170081 0.887673 -0.093982 1.000000 0.190547 -0.051854 -0.015498 -0.103923 -0.032490 -0.104997 -0.033812 -0.055940 -0.111934 0.109097 -0.055041 -0.129059 -0.133325 -0.067274 -0.084508
TURNO_CURSO 0.073950 0.206036 -0.101802 0.190547 1.000000 -0.158526 -0.005389 -0.229394 -0.141098 -0.229328 -0.141409 0.068841 -0.024015 -0.035819 0.016467 -0.035558 -0.051361 -0.062565 -0.080041
DURACAO_CURSO -0.184280 -0.043708 -0.044520 -0.051854 -0.158526 1.000000 0.030573 0.874795 0.897436 0.872780 0.895399 -0.020012 -0.057183 0.228430 -0.123527 0.369550 0.379771 0.186624 0.740090
PERIODOS_TRANCADOS -0.047297 -0.023068 -0.022952 -0.015498 -0.005389 0.030573 1.000000 0.033437 0.033117 0.031815 0.031570 0.038725 -0.088988 0.010443 -0.046666 0.033659 0.077357 0.145727 0.235154
CH_TOTAL_MATRIZ -0.205748 -0.107250 0.008579 -0.103923 -0.229394 0.874795 0.033437 1.000000 0.776458 0.997631 0.774577 -0.014969 -0.097076 0.187058 -0.147628 0.269214 0.291111 0.179451 0.666306
NR_TOTAL_DISCIPLINAS -0.166476 -0.031640 -0.078879 -0.032490 -0.141098 0.897436 0.033117 0.776458 1.000000 0.775094 0.997920 -0.013945 -0.064466 0.227470 -0.118745 0.308221 0.329039 0.192657 0.677726
CH_APROVADA -0.205374 -0.108314 0.008874 -0.104997 -0.229328 0.872780 0.031815 0.997631 0.775094 1.000000 0.777522 -0.015840 -0.094471 0.187059 -0.146215 0.269660 0.290919 0.177722 0.663363
NR_DISC_APROVADA -0.166111 -0.033086 -0.078351 -0.033812 -0.141409 0.895399 0.031570 0.774577 0.997920 0.777522 1.000000 -0.014895 -0.061839 0.227340 -0.117222 0.308252 0.328499 0.190951 0.674754
T_IDADE 0.029181 -0.030578 -0.036046 -0.055940 0.068841 -0.020012 0.038725 -0.014969 -0.013945 -0.015840 -0.014895 1.000000 0.004618 -0.083124 -0.221568 -0.058972 -0.049747 0.002894 0.066553
NOTA 0.079689 -0.113781 0.101507 -0.111934 -0.024015 -0.057183 -0.088988 -0.097076 -0.064466 -0.094471 -0.061839 0.004618 1.000000 0.230289 0.146231 -0.097534 -0.228707 -0.435969 -0.211298
NOTA_ENEM -0.044882 0.121998 -0.211729 0.109097 -0.035819 0.228430 0.010443 0.187058 0.227470 0.187059 0.227340 -0.083124 0.230289 1.000000 NaN 0.046738 0.021614 -0.074023 0.165969
POSSUI_ENEM 0.144720 -0.040707 0.014264 -0.055041 0.016467 -0.123527 -0.046666 -0.147628 -0.118745 -0.146215 -0.117222 -0.221568 0.146231 NaN 1.000000 -0.049739 -0.070329 -0.082955 -0.161014
NRO_REPRO_ACO -0.008124 -0.102713 -0.030389 -0.129059 -0.035558 0.369550 0.033659 0.269214 0.308221 0.269660 0.308252 -0.058972 -0.097534 0.046738 -0.049739 1.000000 0.947237 0.262938 0.334276
NRO_TOTAL_REPRO -0.015831 -0.111095 -0.052127 -0.133325 -0.051361 0.379771 0.077357 0.291111 0.329039 0.290919 0.328499 -0.049747 -0.228707 0.021614 -0.070329 0.947237 1.000000 0.558319 0.438121
NRO_REPRO_NORMAL -0.026626 -0.068551 -0.078249 -0.067274 -0.062565 0.186624 0.145727 0.179451 0.192657 0.177722 0.190951 0.002894 -0.435969 -0.074023 -0.082955 0.262938 0.558319 1.000000 0.453558
SEMESTRES_CURSADOS -0.075669 -0.064741 -0.077461 -0.084508 -0.080041 0.740090 0.235154 0.666306 0.677726 0.663363 0.674754 0.066553 -0.211298 0.165969 -0.161014 0.334276 0.438121 0.453558 1.000000
In [9]:
msno.matrix(df)
#usando a matrix para analisar dados em brancos e possíveis erros.
Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x268f7d35b88>
In [10]:
msno.bar(df)
Out[10]:
<matplotlib.axes._subplots.AxesSubplot at 0x268f690f488>
In [11]:
#df['NOTA_ENEM'] = 
pd.to_numeric(df.NOTA_ENEM, errors='coerce')
df.isnull().sum()
Out[11]:
COD_ALUNO                   0
COD_UNIDADE                 0
COD_TURMA                   0
SEXO                        0
ESTADO_CIVIL                0
DATA_NASCIMENTO             0
CIDADE_ALUNO                0
UF_ALUNO                    4
CEP_ALUNO                   0
COD_CURSO                   0
NOME_CURSO                  0
TURNO_CURSO                 0
DURACAO_CURSO               0
SITUCAO_MATRICULA           0
DATA_CONCLUSAO              0
PERIODOS_TRANCADOS          0
CH_TOTAL_MATRIZ             0
NR_TOTAL_DISCIPLINAS        0
CH_APROVADA                 0
NR_DISC_APROVADA            0
T_IDADE                     0
NOTA                        0
NOTA_ENEM               48029
POSSUI_ENEM                 0
NRO_REPRO_ACO            6487
NRO_TOTAL_REPRO          6487
NRO_REPRO_NORMAL         6487
SEMESTRES_CURSADOS          0
POSSUI_FIES                 0
dtype: int64
In [12]:
NAN_NOTA_ENEM=df[np.isnan(df['NOTA_ENEM'])]
In [13]:
NAN_NOTA_ENEM
df["POSSUI_FIES"]
Out[13]:
0        SIM
1        NAO
2        NAO
3        SIM
4        NAO
        ... 
68821    SIM
68822    NAO
68823    SIM
68824    NAO
68825    SIM
Name: POSSUI_FIES, Length: 68826, dtype: object
In [14]:
df["POSSUI_FIES"]= df["POSSUI_FIES"].replace({'SIM':"1" ,'NAO':"0"})
df.head()
Out[14]:
COD_ALUNO COD_UNIDADE COD_TURMA SEXO ESTADO_CIVIL DATA_NASCIMENTO CIDADE_ALUNO UF_ALUNO CEP_ALUNO COD_CURSO ... NR_DISC_APROVADA T_IDADE NOTA NOTA_ENEM POSSUI_ENEM NRO_REPRO_ACO NRO_TOTAL_REPRO NRO_REPRO_NORMAL SEMESTRES_CURSADOS POSSUI_FIES
0 1000055 508 316720151A 2 S 1996-11-19 00:00:00 BETIM MG 32.661-750 3167 ... 27 21 8.711111 537.575 1 NaN NaN NaN 4 1
1 1000143 550 9917120151A 2 S 1996-09-03 23:00:00 APUCARANA PR 86.801-040 99171 ... 30 21 8.140000 421.000 1 NaN NaN NaN 4 0
2 1000179 1 80820151A 2 S 1950-06-29 23:00:00 CUIABÁ MT 78.065-900 808 ... 30 67 8.510000 NaN 0 NaN NaN NaN 4 0
3 1000210 1 80820151A 2 C 1981-11-23 23:00:00 POCONÉ MT 78.175-000 808 ... 30 36 8.456667 NaN 0 NaN NaN NaN 4 1
4 1000228 6 52220112A 1 S 1979-12-29 23:00:00 SALVADOR BA 41.250-470 522 ... 50 37 7.624490 NaN 0 43.0 48.0 5.0 14 0

5 rows × 29 columns

In [15]:
df["POSSUI_FIES"][df["POSSUI_FIES"]=="0"].groupby(by=df["SEXO"]).count()
Out[15]:
SEXO
1    17929
2    24768
Name: POSSUI_FIES, dtype: int64
In [16]:
df["POSSUI_FIES"][df["POSSUI_FIES"]=="1"].groupby(by=df["SEXO"]).count()
Out[16]:
SEXO
1     8910
2    17219
Name: POSSUI_FIES, dtype: int64
In [17]:
plt.figure(figsize=(6, 6))
labels =["Possui Fies","Não possui Fies"]
values = [26129,42697]
labels_gender = ["M","H","M","H"]
sizes_gender = [939,930 , 2544,2619]
colors = ['#ff6666', '#66b3ff']
colors_gender = ['#c2c2f0','#ffb3e6', '#c2c2f0','#ffb3e6']
explode = (0.3,0.3) 
explode_gender = (0.1,0.1,0.1,0.1)
textprops = {"fontsize":15}
#Plot
plt.pie(values, labels=labels,autopct='%1.1f%%',pctdistance=1.08, labeldistance=0.8,colors=colors, startangle=90,frame=True, explode=explode,radius=10, textprops =textprops, counterclock = True, )
plt.pie(sizes_gender,labels=labels_gender,colors=colors_gender,startangle=90, explode=explode_gender,radius=7, textprops =textprops, counterclock = True, )
#Draw circle
centre_circle = plt.Circle((0,0),5,color='black', fc='white',linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)

plt.title('COMPARAÇÃO DE GÊNERO QUE POSSUI FIES', fontsize=15, y=1.1)

# show plot 
 
plt.axis('equal')
plt.tight_layout()
plt.show()
In [18]:
df["SEMESTRES_CURSADOS"][0]>df['DURACAO_CURSO'][0]
Out[18]:
False
In [19]:
df.shape[0]
Out[19]:
68826
In [20]:
type("SEMESTRES_CURSADOS")
Out[20]:
str
In [21]:
def target(df): 
    list_temp = []
    for i in range(400,500):
        if df['SEMESTRES_CURSADOS'][i] > df['DURACAO_CURSO'][i]:
            list_temp.append(0)
        elif df['SEMESTRES_CURSADOS'][i] <= df['DURACAO_CURSO'][i]:
            list_temp.append(1)
        else:
            list_temp.append(2)
    return list_temp
        
In [22]:
def reprovado(df):
    if df['SEMESTRES_CURSADOS'] > df['DURACAO_CURSO']:
        return 0
    elif df['DURACAO_CURSO'] == df['SEMESTRES_CURSADOS']:
        return 1
    
NOVA_COLUNA=df.apply(reprovado, axis=1)
print(NOVA_COLUNA)

#new_df=df.assign("NOVA_COLUNA")
0        1.0
1        1.0
2        1.0
3        1.0
4        0.0
        ... 
68821    0.0
68822    0.0
68823    0.0
68824    1.0
68825    1.0
Length: 68826, dtype: float64
In [24]:
df['NOVA_COLUNA'] = NOVA_COLUNA
df.head()
#new_df=df.assign("NOVA_COLUNA")
Out[24]:
COD_ALUNO COD_UNIDADE COD_TURMA SEXO ESTADO_CIVIL DATA_NASCIMENTO CIDADE_ALUNO UF_ALUNO CEP_ALUNO COD_CURSO ... T_IDADE NOTA NOTA_ENEM POSSUI_ENEM NRO_REPRO_ACO NRO_TOTAL_REPRO NRO_REPRO_NORMAL SEMESTRES_CURSADOS POSSUI_FIES NOVA_COLUNA
0 1000055 508 316720151A 2 S 1996-11-19 00:00:00 BETIM MG 32.661-750 3167 ... 21 8.711111 537.575 1 NaN NaN NaN 4 1 1.0
1 1000143 550 9917120151A 2 S 1996-09-03 23:00:00 APUCARANA PR 86.801-040 99171 ... 21 8.140000 421.000 1 NaN NaN NaN 4 0 1.0
2 1000179 1 80820151A 2 S 1950-06-29 23:00:00 CUIABÁ MT 78.065-900 808 ... 67 8.510000 NaN 0 NaN NaN NaN 4 0 1.0
3 1000210 1 80820151A 2 C 1981-11-23 23:00:00 POCONÉ MT 78.175-000 808 ... 36 8.456667 NaN 0 NaN NaN NaN 4 1 1.0
4 1000228 6 52220112A 1 S 1979-12-29 23:00:00 SALVADOR BA 41.250-470 522 ... 37 7.624490 NaN 0 43.0 48.0 5.0 14 0 0.0

5 rows × 30 columns

In [25]:
df["NOVA_COLUNA"].value_counts(dropna=False)
Out[25]:
0.0    38788
1.0    30002
NaN       36
Name: NOVA_COLUNA, dtype: int64
In [26]:
df.isnull().sum()
Out[26]:
COD_ALUNO                   0
COD_UNIDADE                 0
COD_TURMA                   0
SEXO                        0
ESTADO_CIVIL                0
DATA_NASCIMENTO             0
CIDADE_ALUNO                0
UF_ALUNO                    4
CEP_ALUNO                   0
COD_CURSO                   0
NOME_CURSO                  0
TURNO_CURSO                 0
DURACAO_CURSO               0
SITUCAO_MATRICULA           0
DATA_CONCLUSAO              0
PERIODOS_TRANCADOS          0
CH_TOTAL_MATRIZ             0
NR_TOTAL_DISCIPLINAS        0
CH_APROVADA                 0
NR_DISC_APROVADA            0
T_IDADE                     0
NOTA                        0
NOTA_ENEM               48029
POSSUI_ENEM                 0
NRO_REPRO_ACO            6487
NRO_TOTAL_REPRO          6487
NRO_REPRO_NORMAL         6487
SEMESTRES_CURSADOS          0
POSSUI_FIES                 0
NOVA_COLUNA                36
dtype: int64
In [27]:
>>> df.dropna(subset=['NOVA_COLUNA'], inplace=True)
#EXCLUINDO VALORES 36 LINHAS COM VALORES NULOS NA NOVA_COLUNA, pois esta coluna é a que revela se o aluno terminou no tempo previsto o curso
In [28]:
df.isnull().sum()
Out[28]:
COD_ALUNO                   0
COD_UNIDADE                 0
COD_TURMA                   0
SEXO                        0
ESTADO_CIVIL                0
DATA_NASCIMENTO             0
CIDADE_ALUNO                0
UF_ALUNO                    4
CEP_ALUNO                   0
COD_CURSO                   0
NOME_CURSO                  0
TURNO_CURSO                 0
DURACAO_CURSO               0
SITUCAO_MATRICULA           0
DATA_CONCLUSAO              0
PERIODOS_TRANCADOS          0
CH_TOTAL_MATRIZ             0
NR_TOTAL_DISCIPLINAS        0
CH_APROVADA                 0
NR_DISC_APROVADA            0
T_IDADE                     0
NOTA                        0
NOTA_ENEM               48000
POSSUI_ENEM                 0
NRO_REPRO_ACO            6482
NRO_TOTAL_REPRO          6482
NRO_REPRO_NORMAL         6482
SEMESTRES_CURSADOS          0
POSSUI_FIES                 0
NOVA_COLUNA                 0
dtype: int64
In [29]:
df['NOVA_COLUNA'].value_counts(dropna=True)
Out[29]:
0.0    38788
1.0    30002
Name: NOVA_COLUNA, dtype: int64
In [30]:
labels = df['NOVA_COLUNA'].unique()
values = df['NOVA_COLUNA'].value_counts()

fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=.3)])
fig.update_layout(title_text="<b>DISTRIBUIÇÃO DE FORMADOS NO TEMPO PREVISTO</b>")
fig.show()
In [31]:
sns.boxplot(x=df["T_IDADE"])
plt.title("BOX PLOT IDADE")
plt.grid(color="black",linestyle=":", linewidth=0.5)
#aplicando o conceito de box plot para verificar possíveis Outliers ma variável idade.
In [32]:
df.columns
Out[32]:
Index(['COD_ALUNO', 'COD_UNIDADE', 'COD_TURMA', 'SEXO', 'ESTADO_CIVIL',
       'DATA_NASCIMENTO', 'CIDADE_ALUNO', 'UF_ALUNO', 'CEP_ALUNO', 'COD_CURSO',
       'NOME_CURSO', 'TURNO_CURSO', 'DURACAO_CURSO', 'SITUCAO_MATRICULA',
       'DATA_CONCLUSAO', 'PERIODOS_TRANCADOS', 'CH_TOTAL_MATRIZ',
       'NR_TOTAL_DISCIPLINAS', 'CH_APROVADA', 'NR_DISC_APROVADA', 'T_IDADE',
       'NOTA', 'NOTA_ENEM', 'POSSUI_ENEM', 'NRO_REPRO_ACO', 'NRO_TOTAL_REPRO',
       'NRO_REPRO_NORMAL', 'SEMESTRES_CURSADOS', 'POSSUI_FIES', 'NOVA_COLUNA'],
      dtype='object')

Fazendo escolhas de colunas que podem interferir no atraso para conclusão do curso

COLUNAS EXCLUÍDAS

1)COD_UNIDADE e COD_TURMA: Essas duas variáveis podem ser utilizadas em estudos futuros, para investigar, por exemplo, por que "tal" unidade tem menos alunos com atraso na conclusão do curso?

2)DATA_NASCIMENTO: mostra excesso de informação, visto que existe uma coluna com idade.

3)CIDADE_ALUNO, UF_ALUNO e CEP_ALUNO: ambas informações podem ser usadas em conjunto com o item ') para investigar quais condições da cidade ou estado favorem ou não para a conclusão sem atraso.

4)COD_CURSO: pode ser excluida devido a utilização da coluna "NOME_CURSO", informações redundantes.

5)SITUACAO_MATRICULA: uma coluna que mostra que todos estão formados, ou seja, nao acrescenta em nada para a análise.

6)DATA_CONCLUSÃO: Não existe uma coluna "INICIO_CURSO" para comparação, ou seja, a data de conclusão não pode ser usada para analise de atraso, visto que não se sabe a data do inicio do curso.

7)CH_TOTAL_MATRIZ, NR_TOTAL_DISCIPLINAS, CH_APROVADA e NR_DISC_APROVADA: São colunas que não fornecem comparações, visto que as informações contidas nela não elucida se o aluno foi ou não reprovado em alguma discilplina e consequentemente atrasando o curso.

8)COD_ALUNO: Identificador único para cada alunos, sem número inteiro, ele pode atrapalhar os modelos.

9)ESTADO_CIVIL: o estado civil do estudante interefere na conclusão ou não do curso no tempo correto?

10)NOME_CURSO: Quais cursos tem o maior indice de reprovação? O que deve ser feito para sanar essa situação?

11)NRO_REPRO_ACO, NRO_TOTAL_REPRO, NRO_REPRO_NORMAL: Comparar as reprovações é intuitivo para saber se concluiu ou nao no tempo estipulado.

12)POSSUI_FIES: Alunos que possuem financiamento estudantil tende a ser mais aplicados? Isto é, terminam o curso no tempo estipulado?

COLUNAS ESCOLHIDAS

1)SEXO: o genêro interfere na conclusão ou não do curso no tempo correto?

2)TURNO_CURSO: Os alunos que estudam a noite reprovam mais? Alunos de tempo integral? São perguntas que esperamos que o modelo responda.

3)DURACAO_CURSO e SEMESTRES_CURSADOS: são as duas colunas chaves para a analise dos dados, visto que se a diferente entre seus itens forem maiores que 1, mostra que o aluno terminou o curso com atraso.

4)PERIODOS_TRANCADOS: é intuitivo imaginar que se o aluno trancar o curso, ele não vai conseguir cumprir o curso nos semestres propostos.

5)T_IDADE: qual a importância da idade na conclusão ou não do curso no tempo estipulado?

6)NOTA: Notas boas são fatores predominantes para o aluno concluir no temopo estipulado o curso?

7)NOTA_ENEM e POSSUI_ENEM: são variáveis que podem ser usadas para, por exemplo, investigar se alunos que possuem notas acima de "x" tem mais chances de concluir o curso no tempo estipulado.

AS ESCOLHAS PARA APLICAÇÃO DOS MODELOS FOI FEITA PARA OTIMIZAR O TEMPO, VISTO QUE, SERIA NECESSÁRIO MAIS TRATAMENTOS NOS DADOS FORNECIDOS PARA MELHORAR O MODELO.

In [33]:
pri_trat=df[['SEXO', 'TURNO_CURSO', 'DURACAO_CURSO', 'PERIODOS_TRANCADOS', 'T_IDADE',
       'NOTA', 'SEMESTRES_CURSADOS','NOVA_COLUNA']]
#escolha das variáveis pertinentes para o  estudo de caso.
In [34]:
pri_trat
Out[34]:
SEXO TURNO_CURSO DURACAO_CURSO PERIODOS_TRANCADOS T_IDADE NOTA SEMESTRES_CURSADOS NOVA_COLUNA
0 2 3 4 0 21 8.711111 4 1.0
1 2 0 4 0 21 8.140000 4 1.0
2 2 0 4 0 67 8.510000 4 1.0
3 2 0 4 0 36 8.456667 4 1.0
4 1 3 8 0 37 7.624490 14 0.0
... ... ... ... ... ... ... ... ...
68821 2 3 8 0 27 7.551020 12 0.0
68822 2 3 4 0 28 7.683333 6 0.0
68823 1 3 8 0 24 7.911321 10 0.0
68824 2 3 4 0 23 8.637037 4 1.0
68825 2 3 8 0 23 8.460870 8 1.0

68790 rows × 8 columns

In [35]:
pri_trat.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 68790 entries, 0 to 68825
Data columns (total 8 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   SEXO                68790 non-null  int64  
 1   TURNO_CURSO         68790 non-null  int64  
 2   DURACAO_CURSO       68790 non-null  int64  
 3   PERIODOS_TRANCADOS  68790 non-null  int64  
 4   T_IDADE             68790 non-null  int64  
 5   NOTA                68790 non-null  float64
 6   SEMESTRES_CURSADOS  68790 non-null  int64  
 7   NOVA_COLUNA         68790 non-null  float64
dtypes: float64(2), int64(6)
memory usage: 4.7 MB
In [227]:
#num_cols = ["NOTA", 'T_IDADE']
In [228]:
#df_std = pd.DataFrame(StandardScaler().fit_transform(df[num_cols].astype('float64')),columns=num_cols)
In [241]:
#df_std
In [233]:
#pri_trat["NOTA"]=df_std["NOTA"]
#pri_trat["T_IDADE"]=df_std["T_IDADE"]
In [36]:
pri_trat
Out[36]:
SEXO TURNO_CURSO DURACAO_CURSO PERIODOS_TRANCADOS T_IDADE NOTA SEMESTRES_CURSADOS NOVA_COLUNA
0 2 3 4 0 21 8.711111 4 1.0
1 2 0 4 0 21 8.140000 4 1.0
2 2 0 4 0 67 8.510000 4 1.0
3 2 0 4 0 36 8.456667 4 1.0
4 1 3 8 0 37 7.624490 14 0.0
... ... ... ... ... ... ... ... ...
68821 2 3 8 0 27 7.551020 12 0.0
68822 2 3 4 0 28 7.683333 6 0.0
68823 1 3 8 0 24 7.911321 10 0.0
68824 2 3 4 0 23 8.637037 4 1.0
68825 2 3 8 0 23 8.460870 8 1.0

68790 rows × 8 columns

PROCESSAMENTO

In [37]:
df=pri_trat
X = df.drop(columns = ['NOVA_COLUNA'])
y = df['NOVA_COLUNA'].values
In [49]:
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.20, random_state = 40, stratify=y)

KNN

In [50]:
knn_model = KNeighborsClassifier(n_neighbors = 11) 
knn_model.fit(X_train,y_train)
predicted_y = knn_model.predict(X_test)
accuracy_knn = knn_model.score(X_test,y_test)
print("KNN accuracy:",accuracy_knn)
KNN accuracy: 0.9974560255851141
In [51]:
print(classification_report(y_test, predicted_y))
              precision    recall  f1-score   support

         0.0       1.00      1.00      1.00      7758
         1.0       1.00      1.00      1.00      6000

    accuracy                           1.00     13758
   macro avg       1.00      1.00      1.00     13758
weighted avg       1.00      1.00      1.00     13758

svc

In [52]:
svc_model = SVC(random_state = 1)
svc_model.fit(X_train,y_train)
predict_y = svc_model.predict(X_test)
accuracy_svc = svc_model.score(X_test,y_test)
print("SVM accuracy is :",accuracy_svc)
SVM accuracy is : 1.0
In [53]:
print(classification_report(y_test, predict_y))
              precision    recall  f1-score   support

         0.0       1.00      1.00      1.00      7758
         1.0       1.00      1.00      1.00      6000

    accuracy                           1.00     13758
   macro avg       1.00      1.00      1.00     13758
weighted avg       1.00      1.00      1.00     13758

RANDON FOREST

In [54]:
model_rf = RandomForestClassifier(n_estimators=500 , oob_score = True, n_jobs = -1,
                                  random_state =50, max_features = "auto",
                                  max_leaf_nodes = 30)
model_rf.fit(X_train, y_train)

# Make predictions
prediction_test = model_rf.predict(X_test)
print (metrics.accuracy_score(y_test, prediction_test))
0.9912051170228231
In [55]:
print(classification_report(y_test, prediction_test))
              precision    recall  f1-score   support

         0.0       0.99      1.00      0.99      7758
         1.0       1.00      0.98      0.99      6000

    accuracy                           0.99     13758
   macro avg       0.99      0.99      0.99     13758
weighted avg       0.99      0.99      0.99     13758

In [56]:
plt.figure(figsize=(4,3))
sns.heatmap(confusion_matrix(y_test, prediction_test),
                annot=True,fmt = "d",linecolor="k",linewidths=3)
    
plt.title(" RANDOM FOREST CONFUSION MATRIX",fontsize=14)
plt.show()
REGRESSÃO LINEAR
In [57]:
lr_model = LogisticRegression()
lr_model.fit(X_train,y_train)
accuracy_lr = lr_model.score(X_test,y_test)
print("Logistic Regression accuracy is :",accuracy_lr)
Logistic Regression accuracy is : 1.0
In [58]:
lr_pred= lr_model.predict(X_test)
report = classification_report(y_test,lr_pred)
print(report)
              precision    recall  f1-score   support

         0.0       1.00      1.00      1.00      7758
         1.0       1.00      1.00      1.00      6000

    accuracy                           1.00     13758
   macro avg       1.00      1.00      1.00     13758
weighted avg       1.00      1.00      1.00     13758

In [59]:
plt.figure(figsize=(4,3))
sns.heatmap(confusion_matrix(y_test, lr_pred),
                annot=True,fmt = "d",linecolor="k",linewidths=3)
    
plt.title("LOGISTIC REGRESSION CONFUSION MATRIX",fontsize=14)
plt.show()
In [ ]: